package com.webserver.test.http;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

/**
 *   HTTP  请求对象
 *      该类的每一个实例用于表示一个HTTP请求内容
 *      每个请求由三部分构成：
 *      请求行，消息头，消息正文
 */
public class HttpServletRequest {
    private Socket socket;
    //请求行相关信息
    private String method;   //请求方式
    private String uri;      //抽象路径
    private String protocol;  //协议版本

    //消息头相关信息
    private Map<String, String> headers = new HashMap<>();

    public HttpServletRequest(Socket socket) throws IOException {  //定义一个构造方法
        this.socket = socket;  //
        //1.1解析请求行
        parseRequestLine();
        //1.2解析消息头
        paresHeaders();
        //1.3解析消息正文
        parseContent();

    }

    /**
     * 解析请求行
     * parse: 解析
     */
    private  void parseRequestLine() throws IOException {
        //1.解析请求
        //1.1解析请求行
        String line = readLine();
        System.out.println("请求行：" + line);



        //http://localhost:8088/myweb/index.html
        String[] array = line.split("\\s");
        method = array[0];
        uri = array[1];  //这里有可能会出数组下标越界异常！原因： 浏览器空请求，后期解决
        protocol = array[2];


        System.out.println("method:" + method);  //GET
        System.out.println("uri:" + uri);        // /myweb/index.html
        System.out.println("protocol:" + protocol); //http/1.1

    }

    /**
     * 解析消息头
     */
    private  void paresHeaders() throws IOException {
        //1.2解析消息头
//        line = readLine();
//            while(!(line = readLine()).isEmpty()){
//                System.out.println("消息头：" + line);
//            }


        while(true){
            String line = readLine();
            if (line.isEmpty()){
                break;
            }
            System.out.println("消息头：" + line);
            //将消息头按照“冒号空格”拆分为消息头的名字和值并以key，value存入headers
            String[] array = line.split(":\\s");
            headers.put(array[0],array[1]);

        }
        System.out.println("headers:" + headers);
    }

    /**
     * 解析消息正文
     */
    private  void parseContent(){}
    /**
     * 通过socket获取的输入流读取客户端发送过来的一行字符串
     *
     * @return
     */
    private String readLine() throws IOException {
        InputStream in = socket.getInputStream();
        char pre = 'a', cur = 'a';  //pre表示上次读取到的字符   cur表示本次读取到的数据
        StringBuilder builder = new StringBuilder();
        int d;
        while ((d = in.read()) != -1) {
            cur = (char) d;
            if (pre == 13 && cur == 10) {  //判断是否连读读取到回车和换行符
                break;
            }
            builder.append(cur);
            pre = cur;  //在进行下次读取字符前将本次读取的字符记作上次读取的字符
        }
        return builder.toString().trim();
    }

    public String getMethod() {
        return method;
    }

    public String getUri() {
        return uri;
    }

    public String getProtocol() {
        return protocol;
    }

    /**
     * 根据消息头的名字对应消息头的值
     * @param name
     * @return
     */
    public String getHeader(String name){
        return headers.get(name);
    }
}